# -------------------------------------- #
# 这里是关于字符串的匹配利器——Re正则表达式
# 正则表达式的效率似乎也不高
# -------------------------------------- #
import re
def test_re():
    # -------------------------------------- #
    # 使用re.compile()函数来编译一个正则表达式字符串，
    # 这将返回一个正则表达式对象，
    # 你可以使用这个对象来进行后续的匹配操作
    # 这里的【r前缀】表示这是一个原始字符串，这样Python就不会对反斜杠进行特殊处理了。
    # -------------------------------------- #
    pattern = re.compile(r'\d+')  # 匹配一个或多个数字
    # -------------------------------------- #
    # 正则表达式包含了许多特殊字符和模式，可以帮助你匹配更复杂的文本模式。
    # .：匹配任意字符（除了换行符）
    # *：匹配前面的子表达式零次或多次
    # +：匹配前面的子表达式一次或多次
    # ?：匹配前面的子表达式零次或一次
    # ^：匹配字符串的起始位置
    # $：匹配字符串的结束位置
    # \d：匹配任意数字，等价于[0-9]
    # \D：匹配任意非数字字符，等价于[^0-9]
    # \s：匹配任意空白字符，包括空格、制表符、换页符等等
    # \S：匹配任意非空白字符
    # \w：匹配任意单词字符，等价于[a-zA-Z0-9_]
    # \W：匹配任意非单词字符
    # -------------------------------------- #
    another_pattern = re.compile(r'\d*'.join('2023'))
    # -------------------------------------- #
    # 进行匹配操作
    # match(): 从字符串的【起始位置】匹配一个模式，如果不是起始位置匹配成功的话，【match()就返回None】。
    # search(): 扫描整个字符串并返回【第一个】成功的匹配。
    # findall(): 找到正则表达式所匹配的【所有子串】，并【返回一个列表】，如果没有找到匹配的，则返回空列表。
    # finditer(): 找到正则表达式所匹配的【所有子串】，并把【它们作为一个迭代器】返回。
    # -------------------------------------- #
    text = "There are 123 apples and 456 oranges."
    # 使用match()方法从字符串的起始位置进行匹配
    match = pattern.match(text)
    if match:
        print("Match found:", match.group())
    else:
        print("No match found.")

    # 使用search()方法在整个字符串中搜索匹配项
    search = pattern.search(text)
    if search:
        print("Search found:", search.group())
    else:
        print("No search found.")

    # 使用findall()方法找到所有匹配项
    findall = pattern.findall(text)
    print(type(findall))
    print("Findall found:", findall)

    # 使用finditer()方法找到所有匹配项
    finditer = pattern.finditer(text)
    print(type(finditer))
    print("Findall found:", finditer)

    # -------------------------------------- #
    # 替换匹配的文本
    # 使用【re.sub()函数】，
    # 你可以替换字符串中匹配正则表达式的部分。
    # 这个函数接受三个参数：【正则表达式】、【替换字符串】和【原始字符串】。
    # -------------------------------------- #
    text = "The price is $123.45."
    new_text = re.sub(r'\d+(\.\d+)?', 'XXX', text)
    print(new_text)  # 输出：The price is XXX.
    pass


if __name__ == '__main__':
    # -------------------------------------- #
    # 这一部分是尝试正则表达式的实例代码
    # -------------------------------------- #
    test_re()